class KthLargest {
private:
    int k;                         // 第k大的数字
    multiset<int> minHeap;          // 用multiset模拟最小堆

public:
    // 构造函数：初始化k和nums数组
    KthLargest(int k, vector<int>& nums) {
        this->k = k;

        // 将nums中的每个元素都插入到multiset中
        for (int num : nums) {
            add(num);
        }
    }
    
    // 每次添加新元素，返回当前第k大的数字
    int add(int val) {
        // 插入新元素到multiset
        minHeap.insert(val);
        
        // 如果multiset的大小超过了k，移除最小元素（即multiset的第一个元素）
        if (minHeap.size() > k) {
            minHeap.erase(minHeap.begin());  // 删除最小的元素
        }

        // multiset的第一个元素就是当前的第k大的元素
        return *minHeap.begin(); // 返回最小元素（即第k大的元素）
    }
};

/**
 * Your KthLargest object will be instantiated and called as such:
 * KthLargest* obj = new KthLargest(k, nums);
 * int param_1 = obj->add(val);
 */